package common

import (
	"net"
	"sync"
)

type ConnImpl struct {
	netConn   net.Conn          // 底层 TCP 连接
	mu        sync.Mutex        // 保护写操作并发安全
	assembler *MessageAssembler // 消息组装器（每个连接一个）
}

func NewConn(netConn net.Conn) *ConnImpl {
	return &ConnImpl{
		netConn:   netConn,
		assembler: NewMessageAssembler(), // 初始化组装器
	}
}

func (c *ConnImpl) ReadFrame2Bytes(isClient bool) (*Frame, []byte, error) {
	for {
		frame, err := decodeFrameFromReader(c.netConn, isClient)
		if err != nil {
			return nil, nil, err
		}
		// 交给组装器处理分片
		complete, data, err := c.assembler.addFrame(frame)
		if err != nil {
			return nil, nil, err
		}
		if complete {
			return frame, data, nil
		}
		// 未完成，继续读取下一个分片
	}
}

func (c *ConnImpl) WriteBytes2Frame(op Opcode, data []byte, isClient bool) error {
	c.mu.Lock()
	defer c.mu.Unlock()

	// 用组装器拆分消息为帧
	frames := c.assembler.splitFrame(op, data, isClient)
	// 依次发送所有帧
	for _, frame := range frames {
		if err := encodeFrameAndWrite(c.netConn, frame, isClient); err != nil {
			return err
		}
	}
	return nil
}

func (c *ConnImpl) Close() error {
	return c.netConn.Close()
}
